#include "creerRegion.h"
 #include <cv.h>
 #include <highgui.h>


CreerRegion::CreerRegion(const char* file)
{
	listeRegion = new vector<Region*>();
	image = cvLoadImage(file);
	largeur = image->width;
	longueur = image->height;
	// Pourcentage de marge pour classer les pixels: ATTENTION De bien écrire les valeurs en double
	percent = 10.0/100.0;
}

void CreerRegion::creer(vector<Germe*> * listeGerme)
{
	initMatriceImage();
	for(int i =0;i<listeGerme->size();i++)
	{
		if(!coordonnee(listeGerme->at(i)->getX(),listeGerme->at(i)->getY()))//le germe n'est dans aucune region
		{
			Region * tempRegion = new Region();
			listeRegion->push_back(tempRegion);
			CvScalar s;
			s=cvGet2D(image,listeGerme->at(i)->getY(),listeGerme->at(i)->getX());
			if(!coordonnee(listeGerme->at(i)->getX(),listeGerme->at(i)->getY()))
			{
				parcourtImage(tempRegion,listeGerme->at(i)->getX(),listeGerme->at(i)->getY(),s);
			}
		}
	}
	
	double t = 255.0/listeRegion->size();
	for(int i=0;i<listeRegion->size();i++)
	{
		for(int a=0;a<listeRegion->at(i)->getNbPoint();a++)
		{
			cvLine(image, cvPoint(listeRegion->at(i)->getX(a),listeRegion->at(i)->getY(a)), cvPoint(listeRegion->at(i)->getX(a),listeRegion->at(i)->getY(a)), CV_RGB(0,i*t,0), 1);
		}
	}
	cvNamedWindow("test");
	cvShowImage("test", image);
	cvWaitKey(0);	
}

void CreerRegion::initMatriceImage()
{
	int total = largeur*longueur;
	for(int i=0;i<total;i++)
	{
		img.push_back(false);
	}
}

void CreerRegion::parcourtImage(Region * r, int x, int y,CvScalar &s)
{
	CvScalar c;
	c=cvGet2D(image,y,x);
	if(c.val[0] >=(s.val[0]*(1.0-percent)) && c.val[0] <=(s.val[0]*(1.0+percent)) && c.val[1] >=(s.val[1]*(1.0-percent)) && c.val[1] <=(s.val[1]*(1.0+percent)) && c.val[2] >=(s.val[2]*(1.0-percent)) && c.val[2] <=(s.val[2]*(1.0+percent)) )//teste si le pixel est accepte
	{
		setCoordonnee(x,y,true);//on met a true
		r->ajouterPoint(x,y);//on ajoute le point
		
		//on appelle tous les autres points
		if(appartient(x-1,y))
		{
			if(!coordonnee(x-1,y))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x-1,y,s);
			}
		}
		if(appartient(x+1,y))
		{
			if(!coordonnee(x+1,y))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x+1,y,s);
			}
		}
		if(appartient(x-1,y-1))
		{
			if(!coordonnee(x-1,y-1))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x-1,y-1,s);
			}
		}
		if(appartient(x,y-1))
		{
			if(!coordonnee(x,y-1))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x,y-1,s);
			}
		}
		if(appartient(x+1,y-1))
		{
			if(!coordonnee(x+1,y-1))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x+1,y-1,s);
			}
		}
		if(appartient(x-1,y+1))
		{
			if(!coordonnee(x-1,y+1))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x-1,y+1,s);
			}
		}
		if(appartient(x,y+1))
		{
			if(!coordonnee(x,y+1))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x,y+1,s);
			}
		}
		if(appartient(x+1,y+1))
		{
			if(!coordonnee(x+1,y+1))//on verifie que le pixel n'est pas a true
			{
				parcourtImage(r,x+1,y+1,s);
			}
		}
	}
}

bool CreerRegion::coordonnee(int x, int y)
{
	int nb = x+y*largeur;//a verifier
	return img[nb];
}

void CreerRegion::setCoordonnee(int x, int y, bool b)
{
	int nb = x+y*largeur;//a verifier
	img[nb]=b;
}

bool CreerRegion::appartient(int x, int y)
{
	if(x>=0 && x<largeur && y>=0 && y<longueur)// a verifier
	{
		return true;
	}
	return false;
}

